unit uElectra ;

interface

uses
    SysUtils,
    Classes,
    uBasic,
    uObjects,
    uPlacement,
    uViewPCB,
    uVisitor,
    GDIPAPI,
    uEDIF,
    ActnList,
    TntDialogs,
    Dialogs ;

type

    TToElectraVisitor = class( TMedaVisitor )
    private
        fStream : TFileStream ;
        //        fState : TElectraState ;

        procedure WriteString( aString : string ) ;
        procedure WriteFormat( const aFmt : string ; const aData : array of const ) ;
        procedure WriteEOR ;

        procedure WriteHeader ;
        procedure WriteFooter ;

    public
        function VisitNode( Instance : TMedaViewable ) : TObject ; override ;

        // viewers
        function VisitNode( Instance : TMedaPCBLayer ) : TObject ; override ;
        function VisitNode( Instance : TMedaPCBInterface ) : TObject ; override ;

        // objects
        function VisitNode( Instance : TMedaObject ) : TObject ; override ;
        function VisitNode( Instance : TMedaVisible ) : TObject ; override ;
        function VisitNode( Instance : TMedaContainer ) : TObject ; override ;
        function VisitNode( Instance : TMedaVisibleContainer ) : TObject ; override ;
        function VisitNode( Instance : TMedaRatsNest ) : TObject ; override ;
        function VisitNode( Instance : TMedaPart ) : TObject ; override ;
        function VisitNode( Instance : TMedaBank ) : TObject ; override ;
        function VisitNode( Instance : TMedaPin ) : TObject ; override ;
        function VisitNode( Instance : TMedaNet ) : TObject ; override ;
        function VisitNode( Instance : TMedaLine ) : TObject ; override ;
        function VisitNode( Instance : TMedaTrack ) : TObject ; override ;
        function VisitNode( Instance : TMedaVia ) : TObject ; override ;
        function VisitNode( Instance : TMedaCopper ) : TObject ; override ;
        function VisitNode( Instance : TMedaShape ) : TObject ; override ;
        function VisitNode( Instance : TMedaStack ) : TObject ; override ;
        function VisitNode( Instance : TMedaModule ) : TObject ; override ;
        function VisitNode( Instance : TMedaProject ) : TObject ; override ;

        procedure SaveToFile( aProject : TMedaProject ) ;
    end ;

    TdmElectra = class( TDataModule )
        ActionList : TActionList ;
        actImport : TAction ;
        actExport : TAction ;
        OpenDialog : TTntOpenDialog ;
        SaveDialog : TTntSaveDialog ;
        procedure actExportExecute( Sender : TObject ) ;
        procedure actImportExecute( Sender : TObject ) ;
        procedure actImportUpdate( Sender : TObject ) ;
        procedure actExportUpdate( Sender : TObject ) ;
        procedure DataModuleDestroy( Sender : TObject ) ;
        procedure DataModuleCreate( Sender : TObject ) ;
    private
        { Private declarations }
        pTree : PEdif ;
    public
        { Public declarations }
    end ;

var
    dmElectra       : TdmElectra ;

implementation

{$R *.dfm}

uses
    uMain,
    uProject ;

{ TdmElectra }

procedure TdmElectra.DataModuleCreate( Sender : TObject ) ;
begin
    pTree := nil ;
end ;

procedure TdmElectra.DataModuleDestroy( Sender : TObject ) ;
begin
    FreeList( pTree ) ;
end ;

procedure TdmElectra.actExportExecute( Sender : TObject ) ;
begin
    with TToElectraVisitor.Create do try
        SaveToFile( dmProject.Project ) ;
    finally
        Free ;
    end ;
end ;

procedure TdmElectra.actExportUpdate( Sender : TObject ) ;
begin
    //
end ;

procedure TdmElectra.actImportExecute( Sender : TObject ) ;
begin
    with TStringlist.Create do try
        Freelist( pTree ) ;
        pTree := nil ;
        with OpenDialog do
            if Execute then begin
                LoadFromFile( Filename ) ;
                pTree := ParseEdif( Text ) ;
            end ;
    finally
        Free ;
    end ;
end ;

procedure TdmElectra.actImportUpdate( Sender : TObject ) ;
begin
    //
end ;

{ TToElectraVisitor }

procedure TToElectraVisitor.SaveToFile( aProject : TMedaProject ) ;
begin
    if assigned( aProject ) and ( aProject.Name <> '' ) then begin
        fStream := TFileStream.Create( aProject.Name + '.dsn', fmCreate ) ;
        try
            WriteHeader ;
            aProject.Accept( Self ) ;
            WriteFooter ;
        finally
            fStream.Free ;
        end ;
    end ;
end ;

function TToElectraVisitor.VisitNode( Instance : TMedaViewable ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaPCBLayer ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaPCBInterface ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaBank ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaPart ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaNet ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaPin ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaVisible ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaObject ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaRatsNest ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaContainer ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaVisibleContainer ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaStack ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaShape ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaProject ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaModule ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaTrack ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaLine ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaCopper ) : TObject ;
begin

end ;

function TToElectraVisitor.VisitNode( Instance : TMedaVia ) : TObject ;
begin

end ;

{---- util}

procedure TToElectraVisitor.WriteHeader ;
begin

end ;

procedure TToElectraVisitor.WriteFooter ;
begin

end ;

procedure TToElectraVisitor.WriteFormat( const aFmt : string ; const aData : array of const ) ;
begin

end ;

procedure TToElectraVisitor.WriteString( aString : string ) ;
var
    l               : integer ;
begin
    l := length( aString ) ;
    if l > 0 then
        fStream.Write( aString[ 1 ], l ) ;
end ;

procedure TToElectraVisitor.WriteEOR ;
begin

end ;

initialization
    dmElectra := TdmElectra.Create( nil ) ;

finalization
    dmElectra.Free ;

end.

